package com.monkeyboy.point;

/**
 * 翻转单词
 * "nowcoder. a am I"-->"I am a nowcoder."
 *
 *解题思路：
 * 1. 先进行字符串的全部翻转
 * 2. 然后对每一个单词进行翻转
 */
public class Point3 {
    public String ReverseSentence(String str) {
        if (str == null || str.length() == 0)
            return str;
        char[] arr = str.toCharArray();//转换成字符数组
        reverse(arr, 0, arr.length - 1);//先全部翻转一次
        int start = 0;//指向单词第一个字母
        int end = 0;//指向单词最后一个字母
        while (start < arr.length) {
            if (arr[start] == ' ') {
                //如果start指向的是空格，就换下一个，因为指针要指向的是单词。
                start++;
                end++;
            } else if (end == arr.length || arr[end] == ' ') {
                //如果是end已经到最后一个长度了或者end是一个空格那么就应该反转了，意思就是一个单词的长度就结束了
                //一个单词就是start到end-1的长度，判断的依据就是end是不是空（单词与单词之间是按照空格分割的）或者到达数组的最后一个字符了
                reverse(arr, start, end - 1);
                //翻转后，应该重新记录下个单词，因此更新end和start。
                end++;
                start = end;//这句和上一句可以写成start = ++end;
            } else {
                //到这里就说明，start指的不是空格，end也指的不是空格，说明是正常单词，end++即可
                end++;
            }
        }
        return String.valueOf(arr);
    }

    private void reverse(char[] arr, int begin, int end) {
        while (begin < end) {
            char temp = arr[begin];
            arr[begin] = arr[end];
            arr[end] = temp;
            begin++;
            end--;
        }
    }

    public static void main(String[] args) {
        Point3 point3 = new Point3();
        String str = "I am student";
        String s = point3.ReverseSentence(str);
        System.out.println(s);
    }
}
